#include <inttypes.h>

typedef unsigned __int128 uint128_t;

void store_uprod(uint128_t *dest, uint64_t x, uint64_t y) {
    // Store the product of a and b in dest
    *dest = x * (uint128_t)y;
}

// Usage:
// 1. Assemble the code:
//    gcc -Og -S -o mult3.5.5.s mult3.5.5.c

// 输出为：
// 	movq	%rsi, %rax        # 将x存储到rax寄存器中
//	mulq	%rdx              # rdx寄存器中存储的是参数3即y，乘法指令将rax和rdx中的值相乘, 实际上乘积结果联合存储在了rdx和rax中
//	movq	%rax, (%rdi)      # 将乘积的低64位存储到dest指向的内存地址中（rdi寄存器存储了参数1即dest，实际是一个内存寻址地址）
//	movq	%rdx, 8(%rdi)     # 将乘积的高64位存储到dest+8字节的内存地址中，因为当前机器是小端序，所以高位存储在高地址中
//	ret

// 注意事项：
// mulq 指令只有一个操作数，乘法指令的操作数是隐含的，实际上是将第一个操作数存储在rax寄存器中，第二个操作数存储在rdx寄存器中。
// 乘法指令的结果存储在rdx和rax寄存器中，低64位存储在rax寄存器中，高64位存储在rdx寄存器中。



